home *** CD-ROM | disk | FTP | other *** search
- /* getspec.c - get sort file spec from cmd line */
- #include "stdio.h"
- #include "cminor.h"
- #include "sortcomp.h"
- #include "merge1.h"
- #include "sortspec.h"
-
- int nkeys ; /* number of sort keys defined */
- SORTKEY keys[ MAX_KEYS ] ; /* data to describe the sort keys */
- SORTSPEC sspec ; /* sort spec. info - fun. address */
-
- /* declare functions before we use their addresses */
- int getl(), getr(), putl(), putr(), sortcomp() ;
-
- getspec(argc,argv)
- int argc ;
- char *argv[] ;
- {
- int i ;
- char *p ;
-
- /* set up defaults for file type, record type & sort fields */
- sspec.ftype = ASC_MODE ;
- sspec.pget = getl ;
- sspec.pput = putl ;
- sspec.pcomp = sortcomp ;
- sspec.rec_size = MAX_RSIZE ;
- nkeys = 0 ;
-
- for( i=3 ; i < argc ; i=i+1 )
- {
- p = argv[i] ;
- if( *p == '-') /* check for dash */
- dospec(p+1) ; /* move past dash, get this spec. */
- else err_msg("bad option format \n") ;
- }
- if( nkeys == 0 ) /* use char string as default key */
- addkey(string_key,ASCENDING,0,sspec.rec_size) ;
- }
-
-
-
- int dospec(p) /* classify and process one spec */
- char *p ; /* points to spec. char (and parms) */
- {
- switch( *p ) /* classify the next char */
- {
- case 'r' : /* fixed length records */
- sspec.pget = getr ;
- sspec.pput = putr ;
- p = p + 1 ; /* move past 'r' */
- /* and get record size */
- sspec.rec_size = -1 ;/* use invalid size to insure */
- sscanf(p,"%d",&sspec.rec_size) ; /* that sscanf reads it */
- if( ( sspec.rec_size < 0 ) /* validate record size */
- || ( sspec.rec_size > MAX_RSIZE) )
- err_msg(" bad record size field \n") ;
- break ;
- case '1' : /* records are text lines */
- sspec.pget = getl ;
- sspec.pput = putl ;
- break ;
- case 'a' : /* ASCII file - check for CTL-Z */
- sspec.ftype = ASC_MODE ;
- break ;
- case 'b' : /* binary file - no check for CTL-Z */
- sspec.ftype = BIN_MODE ;
- break ;
- case 'k' : /* key field spec. */
- if( nkeys == MAX_KEYS )
- err_msg("too many sort keys \n") ;
- p = p + 1 ; /* move past the 'k' */
- getkparm(p) ; /* get and check key parms. */
- break ;
- default :
- err_msg("bad option\n") ;
- break ;
- }
- }
-
-
- int getkparm(word) /* collect and verify key info */
- char word[] ; /* string wirh the parms */
- {
- int kt, ko, ks, kl, n ;
- char tc, oc ;
- /* get perms from cmd. line word */
- kl = -1 ;
- sscanf(word,"%c,%c,%d,%d",&tc,&oc,&ks,&kl) ;
- if( kl == -1 )
- err_msg("not enough info in key field \n:") ;
-
- /* convert and check field type */
-
- kt = sindex( tc,"icslf") ;
- if(kt < 0 )
- err_msg("bad key field type\n") ;
-
- if( oc == 'a' ) /* convert and check sort order */
- ko = ASCENDING ;
- else if( oc == 'd')
- ko = DESCENDING ;
- else err_msg("bad key field order \n") ;
-
- /* check starting offset */
- if( (ks < 0 ) || (ks > sspec.rec_size) )
- err_msg("bad key fiels offset \n") ;
- /* check field length */
- if( (kl <= 0) || ( (ks + kl) > sspec.rec_size) )
- err_msg("bad key field length \n") ;
- addkey(kt,ko,ks,kl) ;
- }
-
-
- int addkey(itype,iorder,ioffset,ilength)
- int itype, iorder, ioffset , ilength ;
- {
- keys[nkeys].ktype = itype ;
- keys[nkeys].korder = iorder ;
- keys[nkeys].kstart = ioffset ;
- keys[nkeys].klength = ilength ;
- nkeys = nkeys + 1 ;
- }
-
-
- int err_msg(s)
- char s[] ;
- {
- printf("%s \n",s) ;
- exit(10) ;
- }
-
-
-
-